package org.jsola.hr.service;

import org.jsola.core.Page;
import org.jsola.core.service.IService;
import org.jsola.hr.dao.IGroupCityDAO;
import org.jsola.hr.dto.GroupCityAddDTO;
import org.jsola.hr.dto.GroupCityUpdateDTO;
import org.jsola.hr.entity.GroupCityDO;
import org.jsola.hr.query.GroupCityQuery;
import org.jsola.hr.vo.GroupCityListVO;
import org.jsola.hr.vo.GroupCityVO;
import org.jsola.user.core.TokenUser;

import java.util.List;


/**
 * 子公司分管城市关系表
 *
 * @author zhr
 */
public interface IGroupCityService extends IService<IGroupCityDAO, GroupCityDO> {

    /**
     * 新增子公司分管城市关系表
     * @param groupCityAddDTO 新增子公司分管城市关系表DTO
     * @param tokenUser 当前用户
     * @return 子公司分管城市关系表详情信息
     */
    GroupCityVO save(GroupCityAddDTO groupCityAddDTO, TokenUser tokenUser);

    /**
     * 批量新增子公司分管城市关系表
     * @param groupCityAddDTOList 新增子公司分管城市关系表DTO
     * @param tokenUser 当前用户
     * @return 子公司分管城市关系表详情信息
     */
    List<GroupCityVO> batchSave(List<GroupCityAddDTO> groupCityAddDTOList, TokenUser tokenUser);

    /**
     * 新增子公司分管所有城市
     * @param groupId 组id
     * @param tokenUser 当前用户
     * @return 子公司分管城市关系表详情信息
     */
    GroupCityVO batchSaveAll(String groupId, TokenUser tokenUser);

    /**
     * 修改子公司分管城市关系表
     * @param groupCityUpdateDTO 修改子公司分管城市关系表DTO
     * @param tokenUser 当前用户
     * @return 更新数量
     */
    int update(GroupCityUpdateDTO groupCityUpdateDTO, TokenUser tokenUser);


    /**
     * 批量删除子公司分管城市关系表，物理删除，更新is_valid字段，从回收站删除
     * @param tokenUser 当前用户
     * @param groupCityIds 子公司分管城市关系表id
     * @return 删除数量
     */
    int deleteByIds(TokenUser tokenUser, String...groupCityIds);

    /**
     * 根据子公司分管城市关系表id查找
     * @param groupCityId 子公司分管城市关系表id
     * @param siteId 所属站点id
     * @return 子公司分管城市关系表详情信息
     */
    GroupCityVO selectById(String groupCityId, String siteId);

    /**
     * 查询子公司分管城市关系表
     * @param groupCityQuery 查询条件
     * @param siteId 所属站点id
     * @return 子公司分管城市关系表列表信息
     */
    List<GroupCityListVO> select(GroupCityQuery groupCityQuery, String siteId);

    /**
    * 查询子公司分管城市关系表记录数
    * @param groupCityQuery 查询条件
    * @param siteId 所属站点id
    * @return 子公司分管城市关系表记录数
    */
    int selectCount(GroupCityQuery groupCityQuery, String siteId);

    /**
     * 分页查询子公司分管城市关系表
     * @param groupCityQuery 查询条件
     * @param siteId 所属站点id
     * @return 子公司分管城市关系表列表信息
     */
    Page<GroupCityListVO> selectPage(GroupCityQuery groupCityQuery, String siteId);


    /**
     * 根据子公司分管城市关系表id查找
     * @param groupCityId 子公司分管城市关系表id
     * @param siteId 所属站点id
     * @return 子公司分管城市关系表
     */
    GroupCityDO selectDOById(String groupCityId, String siteId);

    /**
     * 查询子公司分管城市关系表
     * @param groupCityQuery 查询条件
     * @param siteId 所属站点id
     * @return 子公司分管城市关系表列表
     */
    List<GroupCityDO> selectDO(GroupCityQuery groupCityQuery, String siteId);

    /**
     * 根据子公司id查询组分管的城市
     *
     * @param groupId 组id
     * @param siteId  站点id
     * @return 组id查询组分管的城市
     */
    List<GroupCityListVO> listByGroup(String groupId, String siteId);

    /**
     * 删除某个子公司全部的分管城市
     *
     * @param groupId   组id
     * @param tokenUser 当前用户
     * @return 修改数量
     */
    int deleteByGroup(String groupId, TokenUser tokenUser);

    /**
     * 获取某些子公司的分管地区
     *
     * @param groupIds 子公司
     * @param siteId   站点id
     * @return 某些子公司的分管地区
     */
    List<String> listGroupCityCode(List<String> groupIds, String siteId);

    /**
     * 获取分管某地区的分公司
     *
     * @param cityId 地区id
     * @param siteId 站点id
     * @return 分管某地区的分公司
     */
    List<String> listByCity(String cityId, String siteId);
}


